#ifndef MYTCPSOCKET_H
#define MYTCPSOCKET_H

#include <QTcpSocket>
#include "databasemanager.h"

class MyTcpServer;
class DatabaseManager;

class MyTcpSocket : public QTcpSocket
{
    Q_OBJECT
public:
    // 我们通过构造函数把 socket aDescriptor 传递进来
    explicit MyTcpSocket(qintptr socketDescriptor,MyTcpServer* server, QObject *parent = nullptr);
    ~MyTcpSocket();
    int userId() const; // 添加一个 getter 函数，方便外部获取ID
    void sendJsonResponse(const QJsonObject& jsonObj);  // 新增辅助函数

private:
    void handlePacket(const QByteArray& packetData);    // 新增的私有函数
    void handleLoginRequest(const QJsonObject& jsonObj);
    void handleRegisterRequest(const QJsonObject& jsonObj);
    void handlePrivateMessage(const QJsonObject &jsonObj);
    void handleFriendRequest(const QJsonObject &jsonObj);
    void handleFriendRequestResponse(const QJsonObject& jsonObj);       //处理是否同意了之前发送的好友申请


signals:
    // 自定义一个信号，当处理完成后，发出此信号以销毁线程
    void finished();

private slots:
    // 当有数据可读时，此槽函数被调用
    void onReadyRead();
    // 当客户端断开连接时，此槽函数被调用
    void onDisconnected();

public slots:
    //初始化
    void init();


private:
    qintptr m_socketDescriptor;     // 套接字描述符
    QByteArray m_buffer;            // 缓冲区，用于存储不完整的数据包
    qint32     m_packetSize;        // 当前正在等待的数据包的大小
    DatabaseManager* m_dbManager;   // 添加一个 DatabaseManager 指针成员
    int m_userId;                   //代表当前的用户ID
    QString m_username;             //当前用户名
    MyTcpServer* m_server;          //服务器的指针
};

#endif // MYTCPSOCKET_H
